perm filename SAITTY.FAI[S,AIL]2 blob
sn#125762 filedate 1974-10-19 generic text, type T, neo UTF8
COMPIL(TTY,<INCHRW,INCHRS,INCHWL,INCHSL,INSTR,OUTCHR,OUTSTR,TTYUP
ENTINT <INSTRL,INSTRS,CLRBUF,TTYIN,TTYINS,TTYINL>>
,<SAVE,RESTR,X11,X22,X33,INSET,CAT,STRNGC,GOGTAB,BRKMSK,BKTCHK,.SKIP.,.SONTP>
,<TELETYPE FUNCTIONS>)
EXPO <
IFE ALWAYS,<
EXTERN OTSTRBF
>;IFE ALWAYS
>;EXPO
DEFINE KONVERT(AC) <
SKIPN TTYCVT(USER)
JRST .+5
CAIL AC,"a"
CAILE AC,"z"
JRST .+2
TRZ AC,40 ;FORCE TO BE LOWER CASE
>
HERE (INCHRW) TTCALL A
MOVE USER,GOGTAB
KONVERT (A)
POPJ P,
HERE (INCHRS) TTCALL 2,A ;SKIP IF CHAR WAITING
MOVNI A,1 ;ELSE RETURN -1
MOVE USER,GOGTAB
KONVERT(A)
POPJ P,
HERE (OUTCHR) TTYUUO 1,-1(P) ;OUTPUT THE PARAMETER
SUB P,X22 ;REMOVE PARAMETER
JRST @2(P)
HERE (OUTSTR)
EXPO <
MOVE USER,GOGTAB
EXCH A,-1(SP) ;LENGTH OF STRING
HRRZS A ; REALLY
EXCH B,(SP) ;PTR TO THE STRING
PUSH P,C ;NEED ANOTHER AC
JUMPLE A,OU.OUT ;DON'T DO ANYTHING
OSLOOP: MOVE C,A
SUBI A,14*5-1 ;# CHARS/CHOMP
SKIPLE A ;LOTS LEFT??
MOVEI C,14*5-1 ; YES,
MOVE LPSA,[POINT 7,OTSTRBF];AS GOOD A PLACE AS ANY
ILDB TEMP,B
SKIPE TEMP ;NULL??
IDPB TEMP,LPSA ; NO
SOJG C,.-3
MOVEI TEMP,0 ;A NULL FOR THE END
IDPB TEMP,LPSA
TTCALL 3,OTSTRBF ;RAISON D'ETRE
JUMPG A,OSLOOP
OU.OUT: POP SP,B
POP SP,A
POP P,C
POPJ P,
>;EXPO
NOEXPO <
HLRZ TEMP,(SP) ;SIZE/POSITION FIELDS OF BP
TRZ TEMP,7777 ;CLEAR SIZE FIELD
OR TEMP,-1(SP) ;POSITION, COUNT IN RH FOR DDTOUT
TRNN TEMP,7777 ;IF NULL STRING, QUIT
JRST QUIT
HRLM TEMP,(SP)
MOVE TEMP,[SIXBIT /TTY/] ;DEVICE FOR TTYMES
MOVEM TEMP,-1(SP)
MOVEI TEMP,-1(SP) ;POINT AT SPEC
CALLI TEMP,400047 ;WRITE FIRST CHAR FOR LENGTH CHARS
JFCL ;IT HAS BEEN KNOW TO SKIP-RETURN
QUIT: SUB SP,X22 ;REMOVE THE ARGUMENT
>;NOEXPO
POPJ P, ;DONE
TTWCHR←←=100 ;MAX NUMBER OF CHARS ON TTY INPUT
CMU < ;EXCEPT WE HAVE LARGER INPUT BUFFERS
TTWCHR←←=140
>;CMU
REDSTR: SKIPE SGLIGN(USER)
PUSHJ P,INSET
MOVEI A,TTWCHR
ADDM A,REMCHR(USER)
SKIPLE REMCHR(USER)
PUSHJ P,STRNGC
MOVNI A,TTWCHR
PUSH SP,[0] ;NULL STRING IF NOTHING DONE
PUSH SP,TOPBYTE(USER)
POPJ P,
FINSTR: CAIN TEMP,15 ;REMOVE LFD IF CR BROKE IT
TTCALL TEMP
FINS1: ADDM A,REMCHR(USER) ;NUMBER NOT USED
ADDI A,TTWCHR ;NUMBER USED
HRROS -1(SP) ; TO STRING COUNT WORD
ADDM A,-1(SP) ;UPDATE COUNT WORD
JRST RESTR
HERE (INSTR) PUSHJ P,SAVE
PUSHJ P,REDSTR
MOVE B,-1(P) ;BREAK CHAR
MOVE LPSA,X22 ;# TO REMOVE
INS1: PUUO 0,TEMP ;NEXT CHAR
KONVERT (TEMP) ;**** CONVERT BEFORE TEST BREAKEDNESS *****
INS2: CAMN TEMP,B ;BREAK?
JRST FINSTR ; YES, ALL DONE
IDPB TEMP,TOPBYTE(USER) ;PUT IT AWAY AND
AOJL A,INS1 ; IF ROOM, GO BACK FOR MORE
PUSHJ P,CHRMOR ;MAKE ROOM, THEN GO BACK
JRST INS1 ;
HERE (INCHWL) PUSHJ P,SAVE
PUSHJ P,REDSTR
MOVE LPSA,X11
TTCALL 4,TEMP
INS3: CAIE TEMP,12
NOCMU < ;WE WILL JUST BREAK ON CR OR LF, THANK YOU
EXPO <
CAIN TEMP,33 ;NORMAL ALTMODE.
>;EXPO
NOEXPO <
CAIN TEMP,175
>;NOEXPO
JRST DNSTR
CAIE TEMP,15 ;CR?
TRNE TEMP,600 ;CONTROL BITS ON?
>;NOCMU
CMU < CAIE TEMP,15 ;CR?
CAIN TEMP,12 ; OR LF?
>;CMU
JRST DNSTR ;YES
KONVERT(TEMP)
IDPB TEMP,TOPBYTE(USER) ;PUT IT AWAY
TTCALL TEMP ;GET ANOTHER AND
AOJL A,INS3 ;GO HANDLE IT (IF STILL HAVE ROOM)
PUSHJ P,CHRMOR ;GET ROOM FOR MORE CHARS
JRST INS3 ;GO HANDLE
DNSTR: MOVEM TEMP,.SKIP. ;SET BREAK CHAR
JRST FINSTR
HERE (INCHSL) PUSHJ P,SAVE
MOVE LPSA,X22 ;PARAM (FLAG) AND RETURN
PUSHJ P,REDSTR
SETOM @-1(P) ;ASSUME FAILED
TTCALL 5,TEMP ;ARE THERE CHARS?
JRST FINSTR ;NO
SETZM @-1(P) ;YES, GET THEM
JRST INS3 ;USE INCHWL'S LOOP, NOT INSTR'S
HERE (INSTRL) PUSHJ P,SAVE
MOVE LPSA,X22
PUSHJ P,REDSTR
TTCALL 4,TEMP
MOVE B,-1(P)
JRST INS2
HERE (INSTRS) PUSHJ P,SAVE
MOVE LPSA,X33
PUSHJ P,REDSTR
SETOM @-2(P)
TTCALL 5,TEMP
JRST FINSTR
SETZM @-2(P)
MOVE B,-1(P)
JRST INS2
HERE (CLRBUF) TTCALL 11,
POPJ P,
HERE (TTYINS) PUSHJ P,SAVE
PUSHJ P,REDSTR ;PREPARE TO MAKE A STRING
MOVE LPSA,X33
SETOM @-1(P) ;ASSUME NO CHARS
TTCALL 5,D ;SEE IF LINES WAITING
JRST FINS1 ;NONE WAINTING
MOVE B,[TTCALL D]
JRST TYIN1 ;GO AHEAD
HERE (TTYINL)
PUSHJ P,SAVE
TTCALL 4,D ;WAIT FOR A LINE
MOVE B,[ TTCALL 4,D]
JRST TYIN
HERE (TTYIN) PUSHJ P,SAVE
TTCALL D ;GET A CHAR
MOVE B,[TTCALL D] ;FOR LOOP
TYIN: PUSHJ P,REDSTR ;PREPARE STACK,A,STRNGC FOR A STRING
MOVE LPSA,X33 ;PREPARE TO RETURN
TYIN1: SETZM @-1(P) ;ASSUME NO BREAK CHAR
MOVE X,-2(P) ;TABLE #
MOVEI TEMP,-1 ;BLOCK MUST BE THERE AND TABLE MUST BE INIT'ED
PUSHJ P,BKTCHK ;CHECK TABLE #
JRST FINS1 ;ERROR OF SOME SORT
MOVE FF,BRKMSK(CHNL) ;GET MASK FOR THIS TABLE
ADD CHNL,CDB ;RELOCATE RANGE 1 TO 18
MOVEI Z,1 ;FOR TESTING LINE NUMBERS
SKIPN LINTBL(CHNL) ;DON'T LET TEST SUCCEED IF
MOVEI Z,0 ;WE'RE TO LET LINE NUMBERS THRU
TRNE FF,@BRKCVT(CDB) ;SPECIFY UC COERCION
TLOA C,400000 ;YES
TLZ C,400000 ;NO
MOVE Y,CDB
ADD Y,[XWD D,BRKTBL] ;BRKTBL+RLC(CDB)
JRST TTYN1
TTYN: XCT B ;1 CHAR
TTYN1:
JUMPGE C,TT.NUC ;COERCE BECAUSE OF BRK TBL ?
CAIL D,"a" ;ONLY IF LC
CAILE D,"z"
JRST TT.TSB ;GO TEST BREAK
TRZ D,40 ;MAKE UC
JRST TT.TSB
TT.NUC: KONVERT(D) ;MAY TURN TO UC BECAUSE OF TTY
TT.TSB:
TDNE FF,@Y ;BREAK OR OMIT?
JRST TTYSPC ; YES, FIND OUT WHICH
TTYC: IDPB D,TOPBYTE(USER) ;PUT IT AWAY
AOJL A,TTYN ;COUNT AND CONTINUE
TTNMOR: PUSHJ P,CHRMOR ;ALLOW FOR MORE CHARS
JRST TTYN ;GO GO GO
TTYSPC: HLLZ TEMP,@Y ;WHICH?
TDNN TEMP,FF
JRST TTYN ;OMIT
MOVEM D,@-1(P)
SKIPN Y,DSPTBL(CHNL) ;GET DISPOSITION WORDD FOR THIS TABLE
JRST FINS1 ;DONE, NO SAVE
JUMPL Y,TTYAPP ;APPEND
ERR <TTYIN: cannot retain break char>,1,FINS1
TTYAPP: IDPB D,TOPBYTE(USER) ;COUNT THE BREAK CHAR
ADDI A,1 ;ONE MORE HAPPY CHAR
JRST FINS1
CHRMOR: ADDI A,TTWCHR ;A ← NUMBER CHARS USED
ADDM A,-1(SP) ;UPDATE COUNT
PUSH P,[TTWCHR] ;GET SOME MORE
PUSHJ P,.SONTP ;BE SURE ROOM & ALIGNED
MOVNI A,TTWCHR ;REFRESH THE COUNT
POPJ P,
HERE(TTYUP)
MOVE USER,GOGTAB
MOVE A,-1(P)
EXCH A,TTYCVT(USER)
SUB P,X22
JRST @2(P) ;RETURN
ENDCOM(TTY)